﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using iNet.IO;

namespace iNet.Media
{
	/// <summary>
	/// 表示一個媒體儲存位置。
	/// </summary>
	public sealed class MediaStorage
	{
		#region 靜態欄位
		/// <summary>
		/// 無效的媒體儲存位置。
		/// </summary>
		public static readonly MediaStorage Invalid = new MediaStorage();
		#endregion
		#region 欄位
		readonly object _Storage;
		readonly MediaStorageType _StorageType;
		#endregion
		#region 建構子
		/// <summary>
		/// 初始化新的 MediaStorage 執行個體。
		/// </summary>
		/// <param name="fileName">媒體檔案路徑。</param>
		/// <exception cref="ArgumentNullException">fileName 為 Null (Visual Basic 為 Nothing)。</exception>
		public MediaStorage(string fileName)
		{
			if (fileName == null)
				throw new ArgumentNullException("fileName");
			_Storage = fileName;
			_StorageType = MediaStorageType.File;
		}
		/// <summary>
		/// 初始化新的 MediaStorage 執行個體。
		/// </summary>
		/// <param name="stream">媒體資料流。</param>
		/// <exception cref="ArgumentNullException">stream 為 Null (Visual Basic 為 Nothing)。</exception>
		public MediaStorage(Stream stream)
		{
			//確認參數
			if (stream == null)
				throw new ArgumentNullException("stream");

			//初始化參數
			_Storage = stream;
			_StorageType = MediaStorageType.Stream;
		}
		/// <summary>
		/// 初始化新的 MediaStorage 執行個體。
		/// </summary>
		/// <param name="uri">媒體所在的網路位址。</param>
		/// <exception cref="ArgumentNullException">uri 為 Null (Visual Basic 為 Nothing)。</exception>
		public MediaStorage(Uri uri)
		{
			if (uri == null)
				throw new ArgumentNullException("uri");
			_Storage = uri;
			_StorageType = MediaStorageType.Uri;
		}
		/// <summary>
		/// 初始化新的 MediaStorage 執行個體。
		/// </summary>
		/// <param name="request">存取媒體的網路請求。</param>
		/// <exception cref="ArgumentNullException">request 為 Null (Visual Basic 為 Nothing)。</exception>
		public MediaStorage(WebRequest request)
		{
			if (request == null)
				throw new ArgumentNullException("request");
			_Storage = request;
			_StorageType = MediaStorageType.WebRequest;
		}
		private MediaStorage()
		{
			_StorageType = MediaStorageType.Invalid;
		}
		#endregion
		#region IsValid
		/// <summary>
		/// 取得值以確認媒體儲存位置是否有效。
		/// </summary>
		public bool IsValid
		{
			get
			{
				return (_StorageType != MediaStorageType.Invalid);
			}
		}
		#endregion
		#region FileName
		/// <summary>
		/// 取得媒體儲存的檔案名稱，當 StorageType 不是 File 時將傳回 Null (Visual Basic 為 Nothing)。
		/// </summary>
		public string FileName
		{
			get
			{
				return (_Storage as string);
			}
		}
		#endregion
		#region StorageType
		/// <summary>
		/// 取得媒體儲存的類型。
		/// </summary>
		public MediaStorageType StorageType
		{
			get
			{
				return _StorageType;
			}
		}
		#endregion
		#region Stream
		/// <summary>
		/// 取得媒體儲存的資料流，當 StorageType 不是 Stream 時將傳回 Null (Visual Basic 為 Nothing)。
		/// </summary>
		public Stream Stream
		{
			get
			{
				return (_Storage as Stream);
			}
		}
		#endregion
		#region Uri
		/// <summary>
		/// 取得媒體儲存的網路位址，當 StorageType 不是 Uri 時將傳回 Null (Visual Basic 為 Nothing)。
		/// </summary>
		public Uri Uri
		{
			get
			{
				return (_Storage as Uri);
			}
		}
		#endregion
		#region WebRequest
		/// <summary>
		/// 取得媒體儲存的網路請求，當 StorageType 不是 WebRequest 時將傳回 Null (Visual Basic 為 Nothing)。
		/// </summary>
		public WebRequest WebRequest
		{
			get
			{
				return (_Storage as WebRequest);
			}
		}
		#endregion
	}

	#region MediaStorageType
	/// <summary>
	/// 表示媒體儲存的類型。
	/// </summary>
	public enum MediaStorageType
	{
		/// <summary>
		/// 無效的媒體儲存。
		/// </summary>
		Invalid,
		/// <summary>
		/// 資料流。
		/// </summary>
		Stream,
		/// <summary>
		/// 檔案。
		/// </summary>
		File,
		/// <summary>
		/// 網路請求。
		/// </summary>
		WebRequest,
		/// <summary>
		/// URI。
		/// </summary>
		Uri,
	}
	#endregion
}
